在格鬥、柔道、空手道、相撲之類的格鬥武道有鍛鍊心、技、體
的說法,而這種鍛鍊方式(有一說)是借鑑佛教思想而來。
在日本武道中「身」與「心」的鍛鍊是不可分的,因此武術除了技術之外,漸漸成為精神性和藝術(教養)很高的東西。
武道最終目的是在具體目標的努力中「煉心」(精神隨之修成)。
所以我覺得不只是武道,在任何事情的精進上最後會是在煉心
,設計模式像是一種技術(套路、姿勢)
,武術大師們教導我們用這種套路,配合上基礎(資料結構、程式思維..等)
,可以發揮很大的威力,最終這種技與體的修煉,可以提升自己心性、態度和心法。
態度我覺得非常重要,這種態度可以延伸到其他專業,和其他生活處事的方式上。
(雖然我覺得我自己本身態度和待人處事各方面都還需要加強)
解譯器模式(interpreter),給定一個語言,定義它的語法的一種表示,並定義一個解釋器,這個解釋器使用該表示來解釋語言中的句子。
-- Design Pattern by GoF [大話設計模式 p.407]
當有一個語言需要解釋執行,並且你可以將該語言中的句子表示為一個抽象的語法樹的時候,可以使用解釋器模式。
-- Design Pattern by GoF [大話設計模式 p.411]
因此各個IDE、前處理器、語法分析、編譯器···等也是解譯器模式的應用。
這個模式的UML圖非常像 Chain of Responsibility 以及 Composite···。
用broser為例子實作看看這個模式(虛擬碼··· )。
Context
public class BrowserContext {
private String text;
public String browserText;
public String getText() {
return text;
}
public void setText(String text) {
this.text = text;
}
}
AbstractExpression
public abstract class AbstractExpression {
abstract public void interpret(BrowserContext context);
}
另外兩種Concrete interpreter
public class TerminalExprssion extends AbstractExpression {
@Override
public void interpret(BrowserContext context) {
System.out.println("終端的解釋器");
}
}
public class NonterminalExpression extends AbstractExpression{
@Override
public void interpret(BrowserContext context) {
System.out.println("非終端的解釋器");
}
}
Client (Test)
import org.junit.jupiter.api.Test;
public class Client {
@Test
public void test(){
BrowserContext context = new BrowserContext();
// 先用語法分析器,將詞句分類,選擇要用哪種解釋器解釋。
/**
* 做了各種分類
*/
// 兩種解釋器
AbstractExpression nonterminal = new NonterminalExpression();
AbstractExpression terminal = new TerminalExprssion();
/**
*不同的詞句要對應到對的解釋器
*/
// 終端的丟進終端解釋
terminal.interpret(context);
// 非終端的丟進非終端解釋
nonterminal.interpret(context);
}
}
結果
終端的解釋器
非終端的解釋器